Script feito em bash [AJUDAAAA] [RESOLVIDO]

1. Script feito em bash [AJUDAAAA] [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 21/11/2012 - 18:37h

Galera, meu problema tá sendo o seguinte

- eu tenho um arquivo com X linhas, dividido da seguinte forma:
-4 colunas (divididas por TAB)

O que eu preciso fazer?
Preciso tirar a média de cada coluna.

Já quebrei tanto a cabeça, mas não consigo fazer um script que consiga resolver isso! Se alguém me ajudar, ficarei grato.


  


2. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Daniel Lara Souza
danniel-lara

(usa Fedora)

Enviado em 21/11/2012 - 22:51h

tu chegou e testar com o sed ?


3. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/11/2012 - 23:33h

Ou com cut.

Por exemplo para pegar a primeira coluna você poderia fazer:

grep -v "^$" 'entrada.txt' |
cut -d $(echo -e "\t") -f 1 > /tmp/in_1.txt


e então você faria algo semelhante a:


C=0
VAL=0
while read LN
do
let VAL=LN+VAL
let C=C+1
done < /tmp/in_1.txt

echo "A média é $(( $VAL / $C ))"



para caucular a média da primeira coluna.

Recomendo que pesquise sobre a cauculadora bc para caucular a média com a precisão decimal desejada.

BOA SORTE!!!


4. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/11/2012 - 09:00h

Você pode ler os campos de uma linha em diferentes variáveis passando mais de um nome de variável ao comando interno read do shell. Se houver menos variáveis do que campos, aí sim é que os campos vão todos para a mes variável. Por exemplo:

$ read a b < <(echo 123 456); echo "a=\"$a\"; b=\"$b\""
a="123"; b="456"
$ read a b < <(echo 123 456 abcd efghi); echo "a=\"$a\"; b=\"$b\""
a="123"; b="456 abcd efghi"



5. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 22/11/2012 - 09:47h

Tenta isso:


awk -F"\t" '{ print "1-Col: ",$1, "2-Col: ",$2, "3-Col: ",$3,"4-Col: ", $4,"Media: ", ($1+$2+$3+$4)/4 }' arquivo.txt



6. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/11/2012 - 17:33h

Com awk é fácil. Mas como ele falou de fazer com bash, concluí que não era para usar outra coisa.

Note porém que o que você mostrou não é o que foi pedido. Você fez a média dos valores em cada linha, não dos valores em cada coluna.

Seja com awk, com o shell ou com qualquer outra coisa, você teria de acumular o valor de cada coluna em cada nova linha numa variável separada, contar a quantidade total de linhas e, no final, extrair as médias dos quatro valores acumulados com os dados em cada linha processada. Continua sendo mole de fazer com o awk, mas terá de ser com algo que implemente o algortimo que eu acabei de descrever.


7. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 22/11/2012 - 20:40h

paulo1205 escreveu:

Com awk é fácil. Mas como ele falou de fazer com bash, concluí que não era para usar outra coisa.

Note porém que o que você mostrou não é o que foi pedido. Você fez a média dos valores em cada linha, não dos valores em cada coluna.

Seja com awk, com o shell ou com qualquer outra coisa, você teria de acumular o valor de cada coluna em cada nova linha numa variável separada, contar a quantidade total de linhas e, no final, extrair as médias dos quatro valores acumulados com os dados em cada linha processada. Continua sendo mole de fazer com o awk, mas terá de ser com algo que implemente o algortimo que eu acabei de descrever.


Exatamente isso que eu observei também paulo, eu preciso somar o que ta em cada linha e dividir pela quantidade de linhas pra obter a média, eu tentei com o awk, deu certo blz, mas so pra pegar a coluna inteira...
Outra ideia que tive eh a seguinte: carregar o arquivo todo para um vetor, mas não to conseguindo manipular ele, a ideia eh simples, mas não to conseguindo colocar na prática (a ideia é, fazer um for enquanto não chega ao fim do vetor, e ler até um espaço e armazenar isso em outro vetor, e asssim por diante)...


8. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 22/11/2012 - 21:36h

Já que pode usar awk, leia a documentação desse programa, pois ele é mais útil do que para simplesmente pegar determinados campos de cada linha. Em particular, leia sobre variáveis e sobre os blocos BEGIN e END.


9. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 23/11/2012 - 09:29h

Acho que agora tá certo.



awk -F"\t" '{ \
if($1){ col1+=$1; c1++} \
if($2){ col2+=$3; c2++} \
if($3){ col3+=$3; c3++} \
if($4){ col4+=$4; c4++} \
} END{ print col1/c1, col2/c2, col3/c3, col4/c4 }' arquivo.txt




10. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 23/11/2012 - 15:01h

foxbit3r escreveu:

Acho que agora tá certo.



awk -F"\t" '{ \
if($1){ col1+=$1; c1++} \
if($2){ col2+=$3; c2++} \
if($3){ col3+=$3; c3++} \
if($4){ col4+=$4; c4++} \
} END{ print col1/c1, col2/c2, col3/c3, col4/c4 }' arquivo.txt



foxbit3r, cara muuito obrigado, o awk resolveu meu problema, só mais uma dúvida: eu estou usando comandos bash e awk tudo dentro de um mesmo txt, gostaria de saber se tem algum problema em fazer isso (OBS: no começo do arquivo .txt estou usando #!/bin/bash)!?


11. Re: Script feito em bash [AJUDAAAA] [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/11/2012 - 16:45h

Se o script vai fazer só isso, voê pode transformá-lo num script puramente awk.

#!/usr/bin/awk -f

{
a+=$1
b+=$2
c+=$3
d+=$4
l++
}

END {
printf("%0.3f %0.3f %0.3f %0.3f\n", a/l, b/l, c/l, d/l);
}



12. Mais uma dúvida

Ramiro
ramiro99

(usa Linux Mint)

Enviado em 23/11/2012 - 19:18h

Galera, tem mais um porém no meu script que terei de alterar....O arquivo contém 4 colunas...certo? Eu tenho de fazer a seguinte condição: se o valor da primeira coluna for 0, desconsiderar o conteúdo das outras colunas daquela linha, e passar pra próxima linha....e assim sucessivamente. E aí, alguma luz?

Eu tentei da seguinte forma:
awk -F"\t" '{

if ((col1+=$1)==0) {
col1++;
col2++;
col3++;
col4++;
l++;
}
else {
col1+=$1;
col2+=$2;
col3+=$3;
col4+=$4;
l++;
}
} END{ print col1/l, "\t" col2/l, "\t" col3/l, "\t" col4/l }' "$nomeArquivo" >> "medias_$nomeArquivo"


porém, sem sucesso!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts